'''
Created on 28/04/2013

@author: cristian
'''
from . import ensureParams, jsonifiedview
from flask import request
from pm import app
from pm.database import db
from pm.models.Fases import Fases
from pm.models.Items import Items
from pm.models.MiembrosComite import MiembrosComite
from pm.models.Proyectos import Proyectos
from pm.models.SolicitudCambio import SolicitudCambio
from pm.models.Usuarios import Usuarios
from pm.models.UsuariosRoles import UsuariosRoles
from pm.models.UsuariosRolesFases import UsuariosRolesFases
from sqlalchemy import or_
from sqlalchemy.exc import IntegrityError
import simplejson
from pm.models.Solicitud_Items import Solicitud_Items


@app.route('/miembroscomite/agregar', methods=['GET', 'POST']) 
@jsonifiedview
def agregarMiembrosComite():
    '''
         Metodo que Agrega Miembros al Comite
         @param id_usuarios: lista de identificadores de los usuarios que conformaran el comite
         @param id_proyecto: identificador del proyecto al cual se agregaran los miembros 
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    
    if not ensureParams(params,['id_usuarios','id_proyecto']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        proyecto = Proyectos.query.filter(Proyectos.id_proyecto== params['id_proyecto']).one()
        if proyecto.cantidad_miembros== True:
            response ={"success" : False , "msg" : "La cantidad y miembros de este comite ya fueron definidas"} 
            return response
        
        identificadores= simplejson.loads(params['id_usuarios'])
        for id_usuario in identificadores:
            miembrosComite = MiembrosComite(id_usuario,params['id_proyecto'])
            db.session.add(miembrosComite)
            db.session.commit()
            proyecto = Proyectos.query.filter(Proyectos.id_proyecto ==params['id_proyecto']).update({'cantidad_miembros':True})
            db.session.commit()
        response ={"success" : True , "msg" : "Creacion exitosa!!"} 
        return response    
    except IntegrityError:
        response ={"success" : False , "msg" : "Esta relacion ya existe!!"} 
        return response
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos!!" }
        return response 



@app.route('/miembroscomite/modificar', methods=['GET', 'POST']) 
@jsonifiedview
def modificarMiembroComite():
    '''
         Metodo que Modifica los  Miembros del  Comite
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    response = {}
    
    
    if not ensureParams(params,['id_usuario','id_usuario_modificar','id_proyecto']): 
        response ={"success" : False , "msg" : "Parametros Insuficientes!!"} 
        return response
    try:
        usu= int(str(params['id_usuario']))
        usumod= int(str(params['id_usuario_modificar']))
        usuarioRol = UsuariosRoles.query.filter(UsuariosRoles.id_usuario==usu).filter(UsuariosRoles.id_rol==2).first()
        if usuarioRol:
            usuarioRolFase = UsuariosRolesFases.query.filter(UsuariosRolesFases.id_usuario_rol==usuarioRol.id_usuario_rol).first()
        
            if usuarioRolFase:
                response = {"success" : False , "msg" : "No se puede sacar a un lider de proyecto del comite"} 
                return response
        
        fasesProyecto = Fases.query.filter(Fases.id_proyecto == params['id_proyecto']).all()
        for fp in fasesProyecto:
            item = Items.query.filter(Items.id_fase == fasesProyecto.id_fase).all()
            for i in item:
                solicitudItem = Solicitud_Items.query.filter(Solicitud_Items.id_item == i.id_item).first()
                if solicitudItem != None:
                    solictud = SolicitudCambio.query.filter(SolicitudCambio.id_solicitud_cambio == solicitudItem.id_solicitud_cambio).filter(or_(SolicitudCambio.estado == 'Enviado', SolicitudCambio.estado == 'En Votacion')).first()
                    if solictud!= None: 
                        response = {"success" : False , "msg" : "No se pueden modificar los miembros debido a que este proyecto tiene solicitudes en votacion"} 
                        return response
        if usu == usumod:
            response ={"success" : False , "msg" : "El usuario a modificar es el mismo!!"} 
            return response
        userComite= MiembrosComite.query.filter(MiembrosComite.id_proyecto==params['id_proyecto']).all()
        band=False
        for uc in userComite:
            if uc.id_usuario == usumod:
                band= True
        if band==False:
            miembroComite= MiembrosComite.query.filter(MiembrosComite.id_proyecto==params['id_proyecto']).filter(MiembrosComite.id_usuario==usu).update({'id_usuario':usumod})
            db.session.commit()
            response ={"success" : True , "msg" : "Modificacion exitosa!!"} 
            return response 
        response ={"success" : False , "msg" : "El usuario ya existe en el comite!!"} 
        return response 
    except IntegrityError:
        response ={"success" : False , "msg" : "Esta relacion ya existe!!"} 
        return response
    except Exception, e:
        db.session.rollback()
        response ={"success" : False , "msg" : "Error en la base de datos!!" + str(e)}
        return response 

@app.route('/miembroscomite/listar', methods=['GET', 'POST']) 
@jsonifiedview
def listarComite():
    '''
    Lista el comite de un proyecto determinado.
    @param id:identificador del proyecto 
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    
    response=[]  
    
    if not ensureParams(params,['id']): 
        return response
    #miembrosComite = MiembrosComite.query.all()
    miembrosComite = MiembrosComite.query.filter(MiembrosComite.id_proyecto == params['id'])
    for miembros in miembrosComite:
        #usuario= Usuarios.query
        usuario= Usuarios.query.filter(Usuarios.id_usuario==miembros.id_usuario).one()
        response.append(usuario)
    return response

@app.route('/miembroscomite/listardistinct', methods=['GET', 'POST']) 
@jsonifiedview
def listarComiteDistinct():
    '''
    Lista los usuarios que no forman parte del comite de un determinado proyecto
    @param id:identificador del proyecto 
    
    '''
    params = {'GET':request.args, 'POST':request.form}[request.method]
    
    response=[]  
    
    if not ensureParams(params,['id']): 
        return response
    
    usuarios = Usuarios.query.all()
    list= []
    resp = usuarios
    for u in usuarios:
        usuariosRoles = UsuariosRoles.query.filter(UsuariosRoles.id_usuario== u.id_usuario).all()
        for ur in usuariosRoles:
            usuariosRolesFases= UsuariosRolesFases.query.filter(UsuariosRolesFases.id_usuario_rol == ur.id_usuario_rol).all()
            for urf in usuariosRolesFases:
                if urf.id_proyecto == int(str(params['id'])):
                    if u not in list:
                        list.append(u)
    
    miembrosComite = MiembrosComite.query.filter(MiembrosComite.id_proyecto == params['id']).all()
    for mc in miembrosComite:
        usuarioRemove = Usuarios.query.filter(Usuarios.id_usuario== mc.id_usuario).one()
        if usuarioRemove in list:
            list.remove(usuarioRemove)
   
    return list
    

